Fix string allocation handling with GtkBuilder translations
authorKalev Lember <kalevlember@gmail.com>
Fri, 7 Jun 2013 12:12:14 +0000 (14:12 +0200)
committerKalev Lember <kalevlember@gmail.com>
Sat, 8 Jun 2013 08:54:25 +0000 (10:54 +0200)
Use g_string_assign to avoid issues with assigning GString's internal
buffer back to the same string. This can happen when no translations are
available and _gtk_builder_parser_translate returns back the same
pointer that was passed in.

This fixes a regression from commit e9f182e37a7f6e2dc339054841a3c9f930f
that caused GtkComboBoxText <items> from GtkBuilder to show up empty if
no translations are available.

https://bugzilla.gnome.org/show_bug.cgi?id=700629

gtk/gtkbuilderparser.c
gtk/gtkcelllayout.c
gtk/gtkcomboboxtext.c
gtk/gtkcontainer.c

index 6e42972e900b24397bac527dd3c76a0e87f09e86..11e04cb50690e6ad8323fa0d62443c968e8982e9 100644 (file)
@@ -1128,16 +1128,16 @@ end_element (GMarkupParseContext *context,
 
           if (prop_info->translatable && prop_info->text->len)
             {
-              prop_info->data = g_strdup (_gtk_builder_parser_translate (data->domain,
-                                                                         prop_info->context,
-                                                                         prop_info->text->str));
-              g_string_free (prop_info->text, TRUE);
-            }
-          else
-            {
-              prop_info->data = g_string_free (prop_info->text, FALSE);
+              const gchar *translated;
+
+              translated = _gtk_builder_parser_translate (data->domain,
+                                                          prop_info->context,
+                                                          prop_info->text->str);
+              g_string_assign (prop_info->text, translated);
             }
 
+          prop_info->data = g_string_free (prop_info->text, FALSE);
+
           object_info->properties =
             g_slist_prepend (object_info->properties, prop_info);
         }
index 4f6425de8b2fbc9376c5390840bb44bee65ef594..a6d33aa8f7499fc0486d684ee54c469a5f344de5 100644 (file)
@@ -820,8 +820,7 @@ cell_packing_end_element (GMarkupParseContext *context,
          translated = _gtk_builder_parser_translate (domain,
                                                      parser_data->context,
                                                      parser_data->string->str);
-         g_string_set_size (parser_data->string, 0);
-         g_string_append (parser_data->string, translated);
+         g_string_assign (parser_data->string, translated);
        }
 
       if (parser_data->cell_prop_name)
index a81c8441e8c42ee602a2a61bb8f8b250bec4aa9d..0de9124b07e1bc6b2473fe8db0a36bcbb1c5a8a1 100644 (file)
@@ -240,8 +240,7 @@ item_end_element (GMarkupParseContext *context,
          translated = _gtk_builder_parser_translate (data->domain,
                                                      data->context,
                                                      data->string->str);
-         g_string_set_size (data->string, 0);
-         g_string_append (data->string, translated);
+         g_string_assign (data->string, translated);
        }
 
       gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (data->object), data->id, data->string->str);
index a30420d5327080d7877f0a4d1b582e6c402a9b75..636a02e825092c05678f0996ed33adec0bc07948 100644 (file)
@@ -667,17 +667,15 @@ attributes_end_element (GMarkupParseContext *context,
   /* translate the string */
   if (parser_data->string->len && parser_data->translatable)
     {
-      gchar *translated;
+      const gchar *translated;
       const gchar *domain;
 
       domain = gtk_builder_get_translation_domain (parser_data->builder);
 
-      translated = g_strdup (_gtk_builder_parser_translate (domain,
-                                                            parser_data->context,
-                                                            parser_data->string->str));
-      g_string_set_size (parser_data->string, 0);
-      g_string_append (parser_data->string, translated);
-      g_free (translated);
+      translated = _gtk_builder_parser_translate (domain,
+                                                  parser_data->context,
+                                                  parser_data->string->str);
+      g_string_assign (parser_data->string, translated);
     }
 
   if (parser_data->child_prop_name)